## 总体构成

### 模型：
**个体**：不同个体具有不同行进能力、突破能力、阻碍通行能力、目的地、规划行进路线。

需要支持：

- 不同个体的随机化或指定生成
- 对不同个体在同一道路上行进过程的粗略模拟
- 不同个体各自路线的生成



**道路**：不同道路有不同的可通行程度、通行方向限制。处于不同道路上的个体拥有自己在道路上的行进进度。

需要支持：

- 不同个体在某道路上的行进过程
- 不同个体在同一道路上的相互超越过程



**地点**：不同地点拥有不同的标号。处于不同地点上的个体可能不会立即进入行进路线。

需要支持：

- 不同个体在不同地点进入自身下一条行进路线的控制

    

### 模拟：

以时间颗粒的方式进行。

每轮次模拟一个短时间 $\Delta x$ 内所有个体的行进。

每个时间颗粒内依次进行以下步骤：

1. 对于所有正在道路上处于行进状态的个体进行行进模拟

    1.1 模拟采用随机顺序，每轮次内所有个体按照自身通行能力、道路的可通行程度随机增加自身在道路上的行进程度

    1.2 如果一个个体需要超越某个个体，则结合该个体的突破能力和被超越个体的阻碍通行能力决定其是否超越对应个体

    ​	1.2.1 若该个体超越成功，则按照 1.1 正常计算该个体的行进程度，且该个体无法在这一轮次内被其所超越的个体再次超越

    ​	1.2.2 若该个体超越失败，则该个体的行进程度不能超过其超越失败的个体的行进程度，剩余按照 1.1 计算该个体的行进程度

    ​	1.2.3 若该个体需要超越的个体是本轮次中超越该个体的个体，则按照 1.2.2 计算该个体的行进程度

    1.3 如果某个个体需要超越多个个体，按照被超越个体行进程度从小到大的顺序进行 1.2 的判断

2. 对于所有到达目标地点的个体进行记录、清除

    2.1 需要记录的内容有：该个体的出发时间刻、该个体路程中消耗的时间、该个体的路线

3. 对于所有正在地点中的个体进行开始行进检测

4. 交叉路口处理

我不知道为什么硫化钾要花这么多工夫模拟单条道路，但是在我的构想中交叉路口是重头戏。	

交叉路口可好玩了。怎样布置交通灯，怎样采取交通灯控制策略，等等，都大有可为。

每个交叉路口都有若干个pin（输入口）和port（输出口）。注意交叉路口**不**与建图耦合，图论模型需要自行把进来的车加进pin里面，从port里面弹出车辆。

交叉路口实现红绿灯，并且实现红绿灯控制策略。

万一交叉路口用不着怎么办？为了日后扩展，使用平凡的路口。

### 界面：

需要支持：

- 从指定文件中读取道路图
- 在控制台手动输入生成道路图





# 架构思路

魔理沙一下子揽下了道路处理这项任务，我尊重他的做法。不过现在有点问题。魔理沙把组员的任务概括为建图，图形这几个简单的关键字，可是组员并不清楚要干什么，以及做完以后怎么对接。	

一个事情是对建图的理解。如果按照魔理沙的理解，建图就是生成/读取图，那么我写了graph api。

从前有两只可爱的化合物，一只叫硫化钾，一只叫双氧水，他们各自维护了一张图。有一天，他们走到了一起，发现他们的图对接不上，就写了一堆奇怪的类型转换。这是第一个故事。

第二个故事是说，双氧水调用api，硫化钾躲在背后实现它。他们都不知道对方要干啥，但是他们都很开心。

不过魔理沙可能会比较辛苦。

还有就是junction，我的junction模块应该应该是比较独立的吧。不管图怎么建，只管维护好路口，创建一个Junction()实例就能用。

至于Coggy的图形界面，这是主要逻辑之外的东西，只要我们源源不断的给他喂输出就行了。（按照我目前的理解，图形界面不要调用graph api）
